/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import model.ConnectionFactory;
import model.beans.Cliente;
import model.beans.Pedido;
import model.beans.Situacao;
import model.beans.TipoProduto;

/**
 *
 * @author Carol
 */
public class PedidoDAO {
    private Connection con;
    private PreparedStatement stmtInserir;
    private PreparedStatement stmtAlterar;
    private PreparedStatement stmtDeletar;
    private PreparedStatement stmtEmAberto;
    private PreparedStatement stmtAlterarSituacao;
    private PreparedStatement stmtPedidoConsertado;
    private PreparedStatement stmtBuscaId;
    private PreparedStatement stmtBuscaNumero;
    private PreparedStatement stmtNaoRetirados;
    private PreparedStatement stmtBuscarPedidos;
    private PreparedStatement stmtBuscarPeriodo;
    private PreparedStatement stmtEmAtraso;
    private PreparedStatement stmtAbertoHoje;
    private PreparedStatement stmtConsertoHoje;
    private PreparedStatement stmtBuscarUltimoCadastrado;

    public PedidoDAO() throws Exception{
        con = ConnectionFactory.getConnection();
    }
    
    public PedidoDAO(Connection con) throws Exception{
        this.con = con;        
    }
    
    public void inserir(Pedido pedido) throws SQLException{
        stmtInserir = con.prepareStatement("INSERT INTO pedido (nomeProduto, modelo, fabricante, descricao, dtEntrada, preco, dtConserto, observacao, dtConsertoFinal, idCliente, idSituacao, idTipoProduto) VALUES ( ?, ?, ?, ?, ?, ?, ?, null, null, ?, 1, ?) ;");
        stmtInserir.setString(1, pedido.getNome());
        stmtInserir.setString(2, pedido.getModelo());
        stmtInserir.setString(3, pedido.getFabricante());
        stmtInserir.setString(4, pedido.getDescricao());
        stmtInserir.setDate(5, new java.sql.Date(pedido.getDtEntrada().getTime()));
        stmtInserir.setDouble(6, pedido.getPreco());
        stmtInserir.setDate(7, new java.sql.Date(pedido.getDtConserto().getTime()));
        stmtInserir.setInt(8, pedido.getCliente().getId());
        stmtInserir.setInt(9, pedido.getTpProduto().getId());
        stmtInserir.executeUpdate();      
        stmtInserir.close();
    }
    
    public void alterar(Pedido pedido) throws SQLException{
        stmtAlterar = con.prepareStatement("UPDATE pedido SET nomeProduto = ?, modelo = ?, fabricante = ?, descricao = ?, dtEntrada = ?, preco = ? , dtConserto = ?, idCliente = ?, idTipoProduto = ? where idPedido = ?");
        stmtAlterar.setString(1, pedido.getNome());
        stmtAlterar.setString(2, pedido.getModelo());
        stmtAlterar.setString(3, pedido.getFabricante());
        stmtAlterar.setString(4, pedido.getDescricao());
        stmtAlterar.setDate(5, new java.sql.Date(pedido.getDtEntrada().getTime()));
        stmtAlterar.setDouble(6, pedido.getPreco());
        stmtAlterar.setDate(7, new java.sql.Date(pedido.getDtConserto().getTime()));
        stmtAlterar.setInt(8, pedido.getCliente().getId());
        stmtAlterar.setInt(9, pedido.getTpProduto().getId());
        stmtAlterar.setInt(10, pedido.getId());
        stmtAlterar.executeUpdate();    
        stmtAlterar.close();
    }
    
    public void alterarSituacao(int idPedido, int idSituacao) throws SQLException{
        stmtAlterarSituacao = con.prepareStatement("UPDATE pedido SET idSituacao = ? where idPedido = ?");
        stmtAlterarSituacao.setInt(1, idSituacao);
        stmtAlterarSituacao.setInt(2, idPedido);
        stmtAlterarSituacao.executeUpdate();
        stmtAlterarSituacao.close();
    }
    
    public void pedidoConsertado(Pedido pedido) throws SQLException{
        stmtPedidoConsertado = con.prepareStatement("UPDATE pedido SET observacao = ?, dtConsertoFinal = ?, idSituacao = 3 where idPedido = ?");
        stmtPedidoConsertado.setString(1, pedido.getObservacao());
        stmtPedidoConsertado.setDate(2, new java.sql.Date(pedido.getDtConsertoFinal().getTime()));
        stmtPedidoConsertado.setInt(3, pedido.getId());
        stmtPedidoConsertado.executeUpdate();
        stmtPedidoConsertado.close();
    }
    
    public void deletar(int idPedido) throws SQLException{
        stmtDeletar = con.prepareStatement("DELETE FROM pedido WHERE idPedido = ?");
        stmtDeletar.setInt(1, idPedido);
        stmtDeletar.executeUpdate();
        stmtDeletar.close();
    }
    
    public List<Pedido> emAberto() throws SQLException{
        stmtEmAberto = con.prepareStatement("SELECT * FROM pedido WHERE idSituacao = 1");
        ResultSet rs = stmtEmAberto.executeQuery();
        List<Pedido> pedidosEmAberto = new ArrayList();
        while(rs.next()){
          Pedido pedido = new Pedido();
          Cliente cliente = new Cliente(rs.getInt("idCliente"));
          //Situacao situacao = new Situacao(rs.getInt("idSituacao"));
          TipoProduto tp = new TipoProduto(rs.getInt("idTipoProduto"));
          
          pedido.setId(rs.getInt("idPedido"));
          pedido.setNome(rs.getString("nomeProduto"));
          pedido.setModelo(rs.getString("modelo"));
          pedido.setFabricante(rs.getString("fabricante"));
          pedido.setDescricao(rs.getString("descricao"));
          pedido.setDtEntrada(rs.getDate("dtEntrada"));
          pedido.setPreco(rs.getDouble("preco"));
          pedido.setDtConserto(rs.getDate("dtConserto"));
          pedido.setObservacao(rs.getString("observacao"));
          pedido.setDtConsertoFinal(rs.getDate("dtConsertoFinal"));
          pedido.setCliente(cliente);
          //pedido.setSituacao(situacao);
          pedido.setTpProduto(tp);
          
          pedidosEmAberto.add(pedido);
        }
        return pedidosEmAberto;
    }
    
    public List<Pedido> naoRetirados() throws SQLException{
        stmtNaoRetirados = con.prepareStatement("SELECT * FROM pedido WHERE idSituacao = 3");
        ResultSet rs = stmtNaoRetirados.executeQuery();
        List<Pedido> pedidosNaoRetirados = new ArrayList();
        while(rs.next()){
          Pedido pedido = new Pedido();
          Cliente cliente = new Cliente(rs.getInt("idCliente"));
          //Situacao situacao = new Situacao(rs.getInt("idSituacao"));
          TipoProduto tp = new TipoProduto(rs.getInt("idTipoProduto"));
          
          pedido.setId(rs.getInt("idPedido"));
          pedido.setNome(rs.getString("nomeProduto"));
          pedido.setModelo(rs.getString("modelo"));
          pedido.setFabricante(rs.getString("fabricante"));
          pedido.setDescricao(rs.getString("descricao"));
          pedido.setDtEntrada(rs.getDate("dtEntrada"));
          pedido.setPreco(rs.getDouble("preco"));
          pedido.setDtConserto(rs.getDate("dtConserto"));
          pedido.setObservacao(rs.getString("observacao"));
          pedido.setDtConsertoFinal(rs.getDate("dtConsertoFinal"));
          pedido.setCliente(cliente);
          //pedido.setSituacao(situacao);
          pedido.setTpProduto(tp);
          
          pedidosNaoRetirados.add(pedido);
        }
        return pedidosNaoRetirados;
    }
    
    public Pedido buscaId(int id) throws SQLException{
        stmtBuscaId = con.prepareStatement("SELECT * FROM pedido where idPedido = ?");
        stmtBuscaId.setInt(1, id);
        ResultSet rs = stmtBuscaId.executeQuery();
        Pedido pedido = new Pedido();
        if(rs.next()){
            Cliente cliente = new Cliente(rs.getInt("idCliente"));
            Situacao situacao = new Situacao(rs.getInt("idSituacao"));
            TipoProduto tp = new TipoProduto(rs.getInt("idTipoProduto"));

            pedido.setId(id);
            pedido.setNome(rs.getString("nomeProduto"));
            pedido.setModelo(rs.getString("modelo"));
            pedido.setFabricante(rs.getString("fabricante"));
            pedido.setDescricao(rs.getString("descricao"));
            pedido.setDtEntrada(rs.getDate("dtEntrada"));
            pedido.setPreco(rs.getDouble("preco"));
            pedido.setDtConserto(rs.getDate("dtConserto"));
            pedido.setObservacao(rs.getString("observacao"));
            pedido.setDtConsertoFinal(rs.getDate("dtConsertoFinal"));
            pedido.setCliente(cliente);
            pedido.setSituacao(situacao);
            pedido.setTpProduto(tp);
        }
        return pedido;
    }
    
    public List<Pedido> buscarPedido(String string) throws SQLException{
        stmtBuscarPedidos = con.prepareStatement("SELECT p.idPedido, c.nome, p.nomeProduto, tp.nomeTipoProduto, p.dtEntrada, p.preco FROM pedido p join cliente c on c.idCliente = p.idCliente join tipoproduto tp on tp.idTipoProduto = p.idTipoProduto WHERE p.idSituacao = 1 AND (c.nome like ? or p.nomeProduto like ? or c.cpf like ? or c.endereco like ?) group by p.idPedido");
        String str = "%" + string + "%";
        stmtBuscarPedidos.setString(1, str);
        stmtBuscarPedidos.setString(2, str);
        stmtBuscarPedidos.setString(3, str);
        stmtBuscarPedidos.setString(4, str);
        ResultSet rs = stmtBuscarPedidos.executeQuery();
        List<Pedido> lista = new ArrayList<Pedido>();
        while(rs.next()){
            Cliente cliente = new Cliente();
            cliente.setNome(rs.getString("c.nome"));
            TipoProduto tp = new TipoProduto();
            tp.setNome(rs.getString("tp.nomeTipoProduto"));
            Pedido pedido = new Pedido();
            pedido.setId(rs.getInt("p.idPedido"));
            pedido.setCliente(cliente);
            pedido.setTpProduto(tp);
            pedido.setNome(rs.getString("p.nomeProduto"));
            pedido.setDtEntrada(rs.getDate("p.dtEntrada"));
            pedido.setPreco(rs.getDouble("p.preco"));
            
            lista.add(pedido);
        }
        return lista;
    }
    
    public List<Pedido> buscarPeriodo(Date dtInicial, Date dtFinal) throws SQLException{
        stmtBuscarPeriodo = con.prepareStatement("SELECT p.idPedido, c.nome, p.nomeProduto, tp.nomeTipoProduto, p.dtEntrada, p.preco FROM pedido p join cliente c on c.idCliente = p.idCliente join tipoproduto tp on tp.idTipoProduto = p.idTipoProduto WHERE (p.dtEntrada BETWEEN ? AND ?) AND idSituacao = 1");
        stmtBuscarPeriodo.setDate(1, new java.sql.Date(dtInicial.getTime()));
        stmtBuscarPeriodo.setDate(2, new java.sql.Date(dtFinal.getTime()));
        ResultSet rs = stmtBuscarPeriodo.executeQuery();
        List<Pedido> lista = new ArrayList<Pedido>();
        while(rs.next()){
            Cliente cliente = new Cliente();
            cliente.setNome(rs.getString("c.nome"));
            TipoProduto tp = new TipoProduto();
            tp.setNome(rs.getString("tp.nomeTipoProduto"));
            Pedido pedido = new Pedido();
            pedido.setId(rs.getInt("p.idPedido"));
            pedido.setCliente(cliente);
            pedido.setTpProduto(tp);
            pedido.setNome(rs.getString("p.nomeProduto"));
            pedido.setDtEntrada(rs.getDate("p.dtEntrada"));
            pedido.setPreco(rs.getDouble("p.preco"));
            
            lista.add(pedido);
        }
        return lista;
    }
    
    public List<Pedido> emAtraso(Date dt) throws SQLException{
        stmtEmAtraso = con.prepareStatement("SELECT * FROM pedido WHERE dtConserto < ? AND idSituacao = 1");
        stmtEmAtraso.setDate(1, new java.sql.Date(dt.getTime()));
        ResultSet rs = stmtEmAtraso.executeQuery();
        List<Pedido> lista = new ArrayList<Pedido>();
        while(rs.next()){
            Cliente cliente = new Cliente(rs.getInt("idCliente"));
            Situacao situacao = new Situacao(rs.getInt("idSituacao"));
            TipoProduto tp = new TipoProduto(rs.getInt("idTipoProduto"));
            Pedido pedido = new Pedido();
            pedido.setId(rs.getInt("idPedido"));
            pedido.setNome(rs.getString("nomeProduto"));
            pedido.setModelo(rs.getString("modelo"));
            pedido.setFabricante(rs.getString("fabricante"));
            pedido.setDescricao(rs.getString("descricao"));
            pedido.setDtEntrada(rs.getDate("dtEntrada"));
            pedido.setPreco(rs.getDouble("preco"));
            pedido.setDtConserto(rs.getDate("dtConserto"));
            pedido.setObservacao(rs.getString("observacao"));
            pedido.setDtConsertoFinal(rs.getDate("dtConsertoFinal"));
            pedido.setCliente(cliente);
            pedido.setSituacao(situacao);
            pedido.setTpProduto(tp);
            
            lista.add(pedido);
        }
        return lista;
    }
    
    public List<Pedido> abertoHoje(Date dt) throws SQLException{
        stmtAbertoHoje = con.prepareStatement("SELECT * FROM pedido WHERE dtEntrada = ?");
        stmtAbertoHoje.setDate(1, new java.sql.Date(dt.getTime()));
        ResultSet rs = stmtAbertoHoje.executeQuery();
        List<Pedido> lista = new ArrayList<Pedido>();
        while(rs.next()){
            Cliente cliente = new Cliente(rs.getInt("idCliente"));
            Situacao situacao = new Situacao(rs.getInt("idSituacao"));
            TipoProduto tp = new TipoProduto(rs.getInt("idTipoProduto"));
            Pedido pedido = new Pedido();
            pedido.setId(rs.getInt("idPedido"));
            pedido.setNome(rs.getString("nomeProduto"));
            pedido.setModelo(rs.getString("modelo"));
            pedido.setFabricante(rs.getString("fabricante"));
            pedido.setDescricao(rs.getString("descricao"));
            pedido.setDtEntrada(rs.getDate("dtEntrada"));
            pedido.setPreco(rs.getDouble("preco"));
            pedido.setDtConserto(rs.getDate("dtConserto"));
            pedido.setObservacao(rs.getString("observacao"));
            pedido.setDtConsertoFinal(rs.getDate("dtConsertoFinal"));
            pedido.setCliente(cliente);
            pedido.setSituacao(situacao);
            pedido.setTpProduto(tp);
            
            lista.add(pedido);
        }
        return lista;
    }
    
    public List<Pedido> consertadoHoje(Date dt) throws SQLException{
        stmtConsertoHoje = con.prepareStatement("SELECT * FROM pedido WHERE dtConsertoFinal = ?");
        stmtConsertoHoje.setDate(1, new java.sql.Date(dt.getTime()));
        ResultSet rs = stmtConsertoHoje.executeQuery();
        List<Pedido> lista = new ArrayList<Pedido>();
        while(rs.next()){
            Cliente cliente = new Cliente(rs.getInt("idCliente"));
            Situacao situacao = new Situacao(rs.getInt("idSituacao"));
            TipoProduto tp = new TipoProduto(rs.getInt("idTipoProduto"));
            Pedido pedido = new Pedido();
            pedido.setId(rs.getInt("idPedido"));
            pedido.setNome(rs.getString("nomeProduto"));
            pedido.setModelo(rs.getString("modelo"));
            pedido.setFabricante(rs.getString("fabricante"));
            pedido.setDescricao(rs.getString("descricao"));
            pedido.setDtEntrada(rs.getDate("dtEntrada"));
            pedido.setPreco(rs.getDouble("preco"));
            pedido.setDtConserto(rs.getDate("dtConserto"));
            pedido.setObservacao(rs.getString("observacao"));
            pedido.setDtConsertoFinal(rs.getDate("dtConsertoFinal"));
            pedido.setCliente(cliente);
            pedido.setSituacao(situacao);
            pedido.setTpProduto(tp);
            
            lista.add(pedido);
        }
        return lista;
    }
    
    public Pedido buscaNumero(int id) throws SQLException{
        stmtBuscaNumero = con.prepareStatement("SELECT * FROM pedido where idPedido = ? and idSituacao = 1");
        stmtBuscaNumero.setInt(1, id);
        ResultSet rs = stmtBuscaNumero.executeQuery();
        Pedido pedido = new Pedido();
        if(rs.next()){
            Cliente cliente = new Cliente(rs.getInt("idCliente"));
            Situacao situacao = new Situacao(rs.getInt("idSituacao"));
            TipoProduto tp = new TipoProduto(rs.getInt("idTipoProduto"));

            pedido.setId(id);
            pedido.setNome(rs.getString("nomeProduto"));
            pedido.setModelo(rs.getString("modelo"));
            pedido.setFabricante(rs.getString("fabricante"));
            pedido.setDescricao(rs.getString("descricao"));
            pedido.setDtEntrada(rs.getDate("dtEntrada"));
            pedido.setPreco(rs.getDouble("preco"));
            pedido.setDtConserto(rs.getDate("dtConserto"));
            pedido.setObservacao(rs.getString("observacao"));
            pedido.setDtConsertoFinal(rs.getDate("dtConsertoFinal"));
            pedido.setCliente(cliente);
            pedido.setSituacao(situacao);
            pedido.setTpProduto(tp);
        }
        return pedido;
    }
    
    public int buscarUltimoCadastrado() throws SQLException{
        stmtBuscarUltimoCadastrado = con.prepareStatement("SELECT MAX(idPedido) FROM pedido");
        ResultSet rs = stmtBuscarUltimoCadastrado.executeQuery();
        
        if(rs.next()){
            int id = rs.getInt("MAX(idPedido)");
            int hu3 = id;
            
            return id;
        }else{        
            return 0;
        }
    
    }
}
